var _createClass = function() {
    function a(e, c) {
        for (var b = 0; b < c.length; b++) {
            var d = c[b];
            d.enumerable = d.enumerable || false;
            d.configurable = true;
            if ("value" in d) { d.writable = true }
            Object.defineProperty(e, d.key, d)
        }
    }
    return function(d, b, c) { if (b) { a(d.prototype, b) } if (c) { a(d, c) } return d }
}();

function _classCallCheck(a, b) { if (!(a instanceof b)) { throw new TypeError("Cannot call a class as a function") } }
var ERROR_CONF = { KEY_ERR: 311, KEY_ERR_MSG: "key格式错误", PARAM_ERR: 310, PARAM_ERR_MSG: "请求参数信息有误", SYSTEM_ERR: 600, SYSTEM_ERR_MSG: "系统错误", WX_ERR_CODE: 1000, WX_OK_CODE: 200 };
var BASE_URL = "https://apis.map.qq.com/ws/";
var URL_SEARCH = BASE_URL + "place/v1/search";
var URL_SUGGESTION = BASE_URL + "place/v1/suggestion";
var URL_GET_GEOCODER = BASE_URL + "geocoder/v1/";
var URL_CITY_LIST = BASE_URL + "district/v1/list";
var URL_AREA_LIST = BASE_URL + "district/v1/getchildren";
var URL_DISTANCE = BASE_URL + "distance/v1/";
var Utils = {
    location2query: function location2query(c) { if (typeof c == "string") { return c } var b = ""; for (var a = 0; a < c.length; a++) { var e = c[a]; if (!!b) { b += ";" } if (e.location) { b = b + e.location.lat + "," + e.location.lng } if (e.latitude && e.longitude) { b = b + e.latitude + "," + e.longitude } } return b },
    getWXLocation: function getWXLocation(c, b, a) { wx.getLocation({ type: "gcj02", success: c, fail: b, complete: a }) },
    getLocationParam: function getLocationParam(b) { if (typeof b == "string") { var a = b.split(","); if (a.length === 2) { b = { latitude: b.split(",")[0], longitude: b.split(",")[1] } } else { b = {} } } return b },
    polyfillParam: function polyfillParam(a) {
        a.success = a.success || function() {};
        a.fail = a.fail || function() {};
        a.complete = a.complete || function() {}
    },
    checkParamKeyEmpty: function checkParamKeyEmpty(c, b) {
        if (!c[b]) {
            var a = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + b + "参数格式有误");
            c.fail(a);
            c.complete(a);
            return true
        }
        return false
    },
    checkKeyword: function checkKeyword(a) { return !this.checkParamKeyEmpty(a, "keyword") },
    checkLocation: function checkLocation(c) {
        var a = this.getLocationParam(c.location);
        if (!a || !a.latitude || !a.longitude) {
            var b = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + " location参数格式有误");
            c.fail(b);
            c.complete(b);
            return false
        }
        return true
    },
    buildErrorConfig: function buildErrorConfig(a, b) { return { status: a, message: b } },
    buildWxRequestConfig: function buildWxRequestConfig(c, a) {
        var b = this;
        a.header = { "content-type": "application/json" };
        a.method = "GET";
        a.success = function(d) { var e = d.data; if (e.status === 0) { c.success(e) } else { c.fail(e) } };
        a.fail = function(d) {
            d.statusCode = ERROR_CONF.WX_ERR_CODE;
            c.fail(b.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, result.errMsg))
        };
        a.complete = function(d) {
            var e = +d.statusCode;
            switch (e) {
                case ERROR_CONF.WX_ERR_CODE:
                    c.complete(b.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, d.errMsg));
                    break;
                case ERROR_CONF.WX_OK_CODE:
                    var f = d.data;
                    if (f.status === 0) { c.complete(f) } else { c.complete(b.buildErrorConfig(f.status, f.message)) }
                    break;
                default:
                    c.complete(b.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG))
            }
        };
        return a
    },
    locationProcess: function locationProcess(f, e, c, a) {
        var d = this;
        c = c || function(g) {
            g.statusCode = ERROR_CONF.WX_ERR_CODE;
            f.fail(d.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, g.errMsg))
        };
        a = a || function(g) { if (g.statusCode == ERROR_CONF.WX_ERR_CODE) { f.complete(d.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, g.errMsg)) } };
        if (!f.location) { d.getWXLocation(e, c, a) } else {
            if (d.checkLocation(f)) {
                var b = Utils.getLocationParam(f.location);
                e(b)
            }
        }
    }
};
var QQMapWX = function() {
    function b(i) {
        _classCallCheck(this, b);
        if (!i.key) { throw Error("key值不能为空") }
        this.key = i.key
    }
    _createClass(b, [{
        key: "search",
        value: function f(i) {
            var l = this;
            i = i || {};
            Utils.polyfillParam(i);
            if (!Utils.checkKeyword(i)) { return }
            var k = { keyword: i.keyword, orderby: i.orderby || "_distance", page_size: i.page_size || 10, page_index: i.page_index || 1, output: "json", key: l.key };
            if (i.address_format) { k.address_format = i.address_format }
            if (i.filter) { k.filter = i.filter }
            var n = i.distance || "1000";
            var j = i.auto_extend || 1;
            var m = function m(o) {
                k.boundary = "nearby(" + o.latitude + "," + o.longitude + "," + n + "," + j + ")";
                wx.request(Utils.buildWxRequestConfig(i, { url: URL_SEARCH, data: k }))
            };
            Utils.locationProcess(i, m)
        }
    }, {
        key: "getSuggestion",
        value: function h(i) {
            var k = this;
            i = i || {};
            Utils.polyfillParam(i);
            if (!Utils.checkKeyword(i)) { return }
            var j = { keyword: i.keyword, region: i.region || "全国", region_fix: i.region_fix || 0, policy: i.policy || 0, output: "json", key: k.key };
            wx.request(Utils.buildWxRequestConfig(i, { url: URL_SUGGESTION, data: j }))
        }
    }, {
        key: "reverseGeocoder",
        value: function a(i) {
            var k = this;
            i = i || {};
            Utils.polyfillParam(i);
            var j = { coord_type: i.coord_type || 5, get_poi: i.get_poi || 0, output: "json", key: k.key };
            if (i.poi_options) { j.poi_options = i.poi_options }
            var l = function l(m) {
                j.location = m.latitude + "," + m.longitude;
                wx.request(Utils.buildWxRequestConfig(i, { url: URL_GET_GEOCODER, data: j }))
            };
            Utils.locationProcess(i, l)
        }
    }, {
        key: "geocoder",
        value: function g(i) {
            var k = this;
            i = i || {};
            Utils.polyfillParam(i);
            if (Utils.checkParamKeyEmpty(i, "address")) { return }
            var j = { address: i.address, output: "json", key: k.key };
            wx.request(Utils.buildWxRequestConfig(i, { url: URL_GET_GEOCODER, data: j }))
        }
    }, {
        key: "getCityList",
        value: function c(i) {
            var k = this;
            i = i || {};
            Utils.polyfillParam(i);
            var j = { output: "json", key: k.key };
            wx.request(Utils.buildWxRequestConfig(i, { url: URL_CITY_LIST, data: j }))
        }
    }, {
        key: "getDistrictByCityId",
        value: function d(i) {
            var k = this;
            i = i || {};
            Utils.polyfillParam(i);
            if (Utils.checkParamKeyEmpty(i, "id")) { return }
            var j = { id: i.id || "", output: "json", key: k.key };
            wx.request(Utils.buildWxRequestConfig(i, { url: URL_AREA_LIST, data: j }))
        }
    }, {
        key: "calculateDistance",
        value: function e(i) {
            var k = this;
            i = i || {};
            Utils.polyfillParam(i);
            if (Utils.checkParamKeyEmpty(i, "to")) { return }
            var j = { mode: i.mode || "walking", to: Utils.location2query(i.to), output: "json", key: k.key };
            var l = function l(m) {
                j.from = m.latitude + "," + m.longitude;
                wx.request(Utils.buildWxRequestConfig(i, { url: URL_DISTANCE, data: j }))
            };
            if (i.from) { i.location = i.from }
            Utils.locationProcess(i, l)
        }
    }]);
    return b
}();
module.exports = QQMapWX;